package interview.juc;

import java.util.concurrent.locks.ReentrantLock;

/**
 Lock 和 synchronized 有以下几点不同：
 1. Lock 是一个接口，而 synchronized 是 Java 中的关键字，synchronized 是内
 置的语言实现；
 2. synchronized 在发生异常时，会自动释放线程占有的锁，因此不会导致死锁现
 象发生；而 Lock 在发生异常时，如果没有主动通过 unLock()去释放锁，则很
 可能造成死锁现象，因此使用 Lock 时需要在 finally 块中释放锁；
 3. Lock 可以让等待锁的线程响应中断，而 synchronized 却不行，使用
 synchronized 时，等待的线程会一直等待下去，不能够响应中断
 4. 通过 Lock 可以知道有没有成功获取锁，而 synchronized 却无法办到。
 5. Lock 可以提高多个线程进行读操作的效率。
 在性能上来说，如果竞争资源不激烈，两者的性能是差不多的，而当竞争资源
 非常激烈时（即有大量线程同时竞争），此时 Lock 的性能要远远优于
 synchronized。

 */
class LTicket{
    private int num = 30;
    private ReentrantLock lock = new ReentrantLock();

    public void sale(){
        for (int i = 0; i < 40; i++) {
            lock.lock();
            try{
                if(num > 0){
                    System.out.println(Thread.currentThread().getName()+"卖了一张票，还剩"+ --num +"张票。");
                }
            }finally {
                lock.unlock();
            }
        }

    }
}
public class Juc02_02Lock {
    public static void main(String[] args) {
        LTicket lTicket = new LTicket();
        new Thread(lTicket::sale,"A").start();
        new Thread(lTicket::sale,"B").start();
        new Thread(lTicket::sale,"C").start();
    }
}
